البرمجة

دليل استخدام استعلامات WP_Query

الدليل الشامل في استخدام استعلامات WP_Query في ووردبريس

تُعد فئة WP_Query واحدة من أقوى الأدوات وأكثرها مرونة في نظام إدارة المحتوى ووردبريس، حيث تسمح بإنشاء استعلامات مخصصة لاستخراج المحتوى من قاعدة البيانات بناءً على معايير دقيقة. من خلال WP_Query يمكن للمطورين التحكم الكامل في عرض التدوينات، الصفحات، الأنواع المخصصة من المحتوى، والحقول الوصفية المرتبطة بها، مع إمكانية تصفية النتائج وترتيبها وفقًا لاحتياجات متقدمة. يعد إتقان استخدام WP_Query خطوة أساسية لكل مطور يرغب في بناء مواقع ديناميكية متقدمة قائمة على ووردبريس.

في هذا الدليل الموسّع، سيتم تناول جميع جوانب WP_Query بشكل منهجي وعميق، ابتداءً من الأساسيات وحتى الاستعلامات المعقدة والمتقدمة، مع تغطية الهيكل، المعلمات، الاستخدامات المختلفة، الأداء، الأخطاء الشائعة، والتقنيات المرتبطة.


أولًا: ما هي WP_Query؟

WP_Query هي فئة (Class) موجودة ضمن نواة ووردبريس، وهي مسؤولة عن تنفيذ استعلامات SQL بطريقة آمنة ومدارة من خلال نظام ووردبريس. بعبارة أخرى، تُستخدم WP_Query لطلب التدوينات (أو الأنواع الأخرى من المنشورات) من قاعدة البيانات بناءً على معايير معينة يحددها المطور.

php
$query = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => 10, ) );

الكود أعلاه يسترجع آخر 10 تدوينات من نوع post.


ثانيًا: البنية الأساسية لـ WP_Query

عند إنشاء كائن جديد من WP_Query، يُمرر مصفوفة من المعلمات (arguments) تُحدد خصائص الاستعلام. المعلمات تدعم مجموعة كبيرة من الخيارات التي تتحكم في نوع المحتوى، العدد، الترتيب، الفئات، التصنيفات، الحقول الوصفية، التاريخ، والمزيد.

البنية العامة:

php
$query = new WP_Query( array( // معلمات الاستعلام ) ); if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // عرض المحتوى } wp_reset_postdata(); }

ثالثًا: المعلمات الأساسية للاستعلام

المعلمة الوصف
'post_type' لتحديد نوع المنشور مثل post, page, أو نوع مخصص
'posts_per_page' لتحديد عدد النتائج المسترجعة
'orderby' لترتيب النتائج بناءً على قيمة معينة مثل date, title, meta_value
'order' تحديد الترتيب تصاعدي (ASC) أو تنازلي (DESC)
'category_name' لاستعلام التدوينات حسب اسم الفئة
'tag' لاستعلام التدوينات حسب الوسوم
'paged' لتفعيل الترقيم (pagination)

رابعًا: استعلامات الأنواع المخصصة (Custom Post Types)

عند العمل مع أنواع منشورات مخصصة، مثل “مشاريع”، يمكن استخدام post_type لعرض هذه الأنواع بسهولة:

php
$query = new WP_Query( array( 'post_type' => 'project', 'posts_per_page' => -1, ) );

خامسًا: استعلام التصنيفات (Taxonomy Queries)

يمكن استهداف تصنيفات مخصصة باستخدام tax_query:

php
$query = new WP_Query( array( 'post_type' => 'product', 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => 'electronics', ), ), ) );

يدعم tax_query عمليات أكثر تعقيدًا من خلال الجمع المنطقي بين الشروط باستخدام relation (مثل AND, OR).


سادسًا: استعلامات الحقول الوصفية (Meta Queries)

للاستعلام بناءً على الحقول الوصفية، تُستخدم meta_query:

php
$query = new WP_Query( array( 'post_type' => 'event', 'meta_query' => array( array( 'key' => 'event_date', 'value' => '2025-01-01', 'compare' => '>=', 'type' => 'DATE', ), ), ) );

تُستخدم meta_query بكثرة عندما يحتوي المحتوى على بيانات إضافية محفوظة كـ Metadata.


سابعًا: استعلامات التاريخ والوقت

php
$query = new WP_Query( array( 'date_query' => array( array( 'after' => 'January 1st, 2024', ), ), ) );

تُستخدم date_query لفلترة التدوينات بناءً على تاريخ النشر، ويمكن دمجها مع معلمات أخرى.


ثامنًا: الجمع بين شروط متعددة

يمكن الجمع بين meta_query و tax_query و date_query ضمن استعلام واحد لإنشاء استعلامات مركبة ومعقدة.

php
$query = new WP_Query( array( 'post_type' => 'course', 'meta_query' => array( array( 'key' => 'duration', 'value' => 10, 'compare' => '>=', 'type' => 'NUMERIC', ), ), 'tax_query' => array( array( 'taxonomy' => 'level', 'field' => 'slug', 'terms' => 'beginner', ), ), ) );

تاسعًا: استعلامات متقدمة باستخدام المعاملات المنطقية

php
'meta_query' => array( 'relation' => 'AND', array( 'key' => 'price', 'value' => 100, 'compare' => '>=', 'type' => 'NUMERIC', ), array( 'key' => 'availability', 'value' => 'in_stock', 'compare' => '=', ), ),

المرونة الكبيرة التي توفرها relation تجعل من الممكن إنشاء شروط منطقية شديدة التعقيد لتصفية المحتوى بدقة عالية.


عاشرًا: الأداء وتحسين الاستعلامات

عند التعامل مع مواقع تحتوي على كميات ضخمة من البيانات، يجب الانتباه إلى أداء الاستعلامات. بعض النصائح تشمل:

  • تجنب استخدام posts_per_page => -1 بشكل مفرط.

  • تأكد من وجود فهارس (Indexes) على الحقول الوصفية المستخدمة بكثرة.

  • استخدام fields => 'ids' عند الحاجة فقط إلى المعرفات لتقليل الحمل.


الحادي عشر: تقنيات مفيدة وملاحظات متقدمة

استخدام get_posts كبديل خفيف

get_posts() هي دالة مغلفة تستخدم WP_Query ولكن تُرجع نتائج أقل تعقيدًا، مما يجعلها أسرع للأغراض البسيطة.

php
$posts = get_posts( array( 'numberposts' => 5, 'post_type' => 'post', ) );

استخدام pre_get_posts لتعديل الاستعلام الرئيسي

php
function modify_main_query( $query ) { if ( is_home() && $query->is_main_query() ) { $query->set( 'posts_per_page', 5 ); } } add_action( 'pre_get_posts', 'modify_main_query' );

تُستخدم هذه الطريقة لتخصيص استعلامات ووردبريس الافتراضية دون الحاجة لإنشاء استعلام جديد.


التعامل مع الاستعلامات الفارغة

في حال عدم وجود نتائج، يجب دائمًا استخدام شرط have_posts() لتجنب الأخطاء.


جدول ملخص للمعلمات الأكثر استخدامًا في WP_Query

المعلمة النوع الوصف
post_type سلسلة نوع المحتوى (post, page, custom)
posts_per_page عدد عدد النتائج
orderby سلسلة ترتيب النتائج (date, title, meta_value, إلخ)
order سلسلة تصاعدي ASC أو تنازلي DESC
meta_query مصفوفة استعلام حسب الحقول الوصفية
tax_query مصفوفة استعلام حسب التصنيفات
paged عدد لتفعيل الترقيم
date_query مصفوفة استعلام حسب التاريخ والوقت
author عدد أو مصفوفة لاستعلام التدوينات حسب الكاتب
s سلسلة البحث النصي داخل المحتوى

المصادر والمراجع


تم تصميم هذا الدليل ليكون مرجعًا تقنيًا شاملًا حول استخدام WP_Query في ووردبريس، وقد رُكز فيه على تغطية الجوانب العملية والبرمجية كافة بطريقة احترافية قابلة للتنفيذ مباشرة داخل مشاريع المطورين.